package xutil

import (
	"sync"
	"time"
)

var (
	st = time.Date(2017, time.January, 1, 0, 0, 0, 0, time.UTC)
	l  sync.Mutex

	fb  int64
	dur = time.Millisecond * 100

	cnt int64 = 10000
	idx int64

	parse = []string{
		"-", "A", "B", "C", "D", "E", "F", "G", "H", "I",
		"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
		"T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3",
		"4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
		"e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
		"o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
		"y", "z", "0",
	}
)

func getid() int64 {
	l.Lock()
	defer l.Unlock()

BEGIN:
	b := int64(time.Now().Sub(st)/dur) * cnt
	var id int64

	if b == fb {
		if idx < cnt-1 {
			idx++
			id = b + idx
		} else {
			time.Sleep(dur)
			goto BEGIN
		}
	} else {
		idx = 0
		fb = b
		id = b
	}

	return id
}

// UniqueUint64 获取唯一 id
func UniqueUint64() uint64 {
	return uint64(getid())
}

// UniqueInt64 获取唯一 id
func UniqueInt64() int64 {
	return getid()
}

func GetFixedUniqueInt64(sid int32) int64 {
	id := getid()
	if sid > 0 {
		id += int64(sid) * 100000000000000
	}
	return id
}

// UniqueString 获取唯一 string
func UniqueString() string {
	id := getid()
	return ID2String(id)
}

// ID2String Id转换成string
func ID2String(id int64) string {
	l := int64(len(parse))
	str := ""
	for {
		str = parse[id%l] + str
		id = id / l
		if id == 0 {
			break
		}
	}
	return str
}
